// pages/examine/facialinput/facialinput.js
import {
  splitBase64IntoChunks
} from '../../../../utils/util';
const app = getApp().globalData
Page({

  /**
   * 页面的初始数据
   */
  data: {
    src: "/images/hui_tou.png",
    imgType: null,
    StartEntry: false,
    active: 2,
    steps: [{
        text: '步骤一',
        desc: '身份选择',
      },
      {
        text: '步骤二',
        desc: '个人信息填写',
      },
      {
        text: '步骤三',
        desc: '人脸录入',
      },
    ],
  },
  // 开始拍照
  takePhoto() {
    this.AudioContext.stop() // 停止
    let _this = this
    this.ctx.takePhoto({
      quality: 'high',
      success: (res) => {
        this.setData({
          src: res.tempImagePath,
          StartEntry: false
        })
        console.log(res.tempImagePath);
        // 如果需要获取图片类型的话
        wx.getImageInfo({
          src: res.tempImagePath,
          async success(json) {
            console.log(json);
            _this.setData({
              imgType: json.type
            })
          }
        });
      }
    })
  },
  error(e) {
    console.log(e.detail)
  },
  // 开始录入
  beginEntry() {
    this.setData({
      StartEntry: true
    });
    this.AudioContext.play()
    this.AudioContext.onPlay(() => {
      console.log('开始播放')
    })
  },
  // 图片放大
  clickImg(e) {
    if (this.data.src == "/images/hui_tou.png") return
    let url = this.data.src
    wx.previewImage({
      urls: [url],
    })
  },
  // 上传图片
  async Upload() {
    let imgBase64 = null;
    // 转base64
    const fs = wx.getFileSystemManager()
    // 同步接口
    try {
      const res_base64 = fs.readFileSync(this.data.src, 'base64', 0)
      console.log("人脸的base64：", res_base64)
      imgBase64 = res_base64
    } catch (e) {
      wx.showToast({
        title: e,
      })
    };
    wx.showLoading({
      title: '人脸图片检验中~',
      mask: true
    });
    let chunks = splitBase64IntoChunks(imgBase64, 1024 * 64)
    console.log(chunks);
    // return
    const socket = wx.connectSocket({
      url: app.ws,
      success() {
        console.log("socket 服务器连接成功");
      },
      fail() {
        console.log("socket 服务器连接失败");
      }
    });
    socket.onOpen((res) => {
      socket.send({
        data: JSON.stringify({
          event: 'imgName',
          data: app.userInfo.username + '.' + this.data.imgType
        })
      });
      console.log("onOpen", res);
      socket.onMessage(async (data) => {
        const json = JSON.parse(data.data)
        console.log("服务器返回来的数据:", json);
        if (json.event == "sentImgUrl") {
          // 进行人脸检测
          let result = await getApp().$axios("/faceDetect", "POST", {
            Url: 'https://' + json.data.imgUrl
          });
          console.log("人脸检测的结果", result);
          if (result.status == 400 && result.data.code == "InvalidParameterValue.NoFaceInPhoto") {
            wx.showModal({
              title: "检测结果",
              content: '图片中没有检测到人脸请重新拍照！',
              showCancel: false,
              complete: (res) => {
                this.beginEntry()
              }
            })
          } else {
            if (result.data.FaceInfos[0].FaceAttributesInfo.Mask) {
              wx.showModal({
                title: '结果',
                content: '请摘下口罩重新拍！',
                showCancel: false,
                complete: (res) => {
                  this.beginEntry()
                }
              })
              return;
            }
            app.userInfo.face_url= 'https://' + json.data.imgUrl
            // 关闭连接
            socket.close({
              code: 1000
            })
            // 存储个人信息，返回token
            wx.showLoading({
              title: '登录中~',
            });
            try {
              const json = await getApp().$axios("/addStudent", "POST", app.userInfo);
              // 获取数据出问题
              if (json.status !== 200) {
                wx.showToast({
                  title: json.msg,
                  icon: 'error'
                })
                return;
              };
              wx.login({
                success: async (res) => {
                  const json1 = await getApp().$axios("/login", "POST", {
                    code: res.code
                  });
                  console.log(json1);
                  // 正常登录
                  let {
                    session_key,
                    confirm_identity,
                    createdAt,
                    updatedAt,
                    ...userInfo
                  } = json1.data
                  app.userInfo = userInfo
                  wx.setStorageSync('token', json1.data.token);
                  wx.setStorageSync('userInfo', json1.data);
                  console.log(app.userInfo);
                  wx.reLaunch({
                    url: '/pages/home/home',
                  })
                },
              })

            } catch (error) {
              wx.showToast({
                title: result.msg,
                icon: 'error'
              })
            }
          }
        }
      });
      // 逐个发送块数据
      chunks.forEach((chunk, index) => {
        let eventData = {
          event: 'base64Data', // 事件标识字段
          data: chunk
        };
        setTimeout(() => {
          socket.send({
            data: JSON.stringify(eventData),
            success: () => {
              console.log(`块 ${index + 1}/${chunks.length} 已发送`);
              if (index === chunks.length - 1) {
                // 所有块数据已发送，发送结束消息
                socket.send({
                  data: JSON.stringify({
                    data: {},
                    event: 'upload_complete'
                  }),
                  success: () => {
                    console.log('上传完成');
                    // 关闭定时器或执行其他操作
                    wx.hideLoading()
                  },
                });
              };
            },
          });
        }, index * 200); // 延迟发送以避免过快发送
      });

      socket.onError((error) => {
        console.log("错误信息：", error);
      });
      socket.onClose((code, reason) => {
        console.log("一个数字值表示关闭连接的状态号，表示连接被关闭的原因。:", code, "表示连接被关闭的原因。", reason);
      })
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 加载相机
    this.ctx = wx.createCameraContext()
    // 创建音频播放
    this.AudioContext = wx.createInnerAudioContext()
    this.AudioContext.src = 'images/mp3/1695452017118.mp3'
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    this.AudioContext.stop() // 停止
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})